<script>
  const arr = ["b", "c","b", "c","a", "b", "c"] 
// s='abbccca'
// const obj = {}
function f(arr){
  return arr.reduce((res,c)=>{
    res[c]?res[c]++:res[c]=1;
    return res}
  ,{})
}
const obj = f(arr) // obj ===> {0: '男', 1:'女'}
  console.log(obj);
//  const obj=acc
// function statArr(arr) {
//         let obj = {}
//         arr.forEach(function (a, b) {
//             // obj[a]=obj[a]+1||1
//             // obj[a] ? obj[a]++ : obj[a] = 1
//             if (obj[a]) {//返回为真进入if语句，obj为空时，输入obj[a]查询为undefined，返回为假
//                 obj[a]++
//             } else {
//                 obj[a] = 1
//             }
//         })
//         for (var key in obj) {
//             console.log(key + ":" + obj[key])
//         }
//     }
//     let arr = ["aa", "aa", "cc", "cc"]
//     ststArr(arr)
// console.log(acc) // ==> {a：1， b: 3, c:  3}
    /**
 * 把平铺的数组结构转成树形结构
 * 思路：1.对list做，第一轮循环
 * （1）给每一个list中的对象补充children属性，直接赋值空数组
 * （2）.建立一个字典（方便后期做查询），{属性名是id：值是对象本身}
 * 2.对list做，第二轮循环
 * 根据pid找父子关系*/

//  function tranListToTreeData(list) {
//   // 最终要产出的树状数据的数组
//   const treeList = []
//   // 所有项都使用对象存储起来
//   const map = {}
//   // 建立一个映射关系：通过id快速找到对应的元素
//   list.forEach(item => {
//     //   查看数组中的每一项是否有children属性
//     // console.log(item);
//     if (!item.children) {
//         // 如果没有这个属性就动态添加一下
//       item.children = []
//     }
//     // 把每一项中的id值取出来作为属性名把每一项作为属性值
//     // 给map动态添加
//     map[item.id] = item
//  // console.log(map[item.id]);
//   })
// //    console.log(map);
//   list.forEach(item => {
//     //   console.log(item);
//     // 根据pid找父子关系
//     // 对于每一个元素来说，先找它的上级
//     //    如果能找到，说明它有上级，则要把它添加到上级的children中去
//     //    如果找不到，说明它没有上级，直接添加到 treeList
//     const parent = map[item.pid]
//     // console.log(parent);
//     // console.log(map[item.pid]);
//     // 如果存在上级则表示item不是最顶层的数据
//     if (parent) {
//         // 如果存在上级就把这一项存到它上级的children属性中
//       parent.children.push(item)
//     } else {
//       // 如果不存在上级 则是顶层数据,直接添加到新数组中
//       treeList.push(item)
//     }
//   })
//   // 返回出去
//   return treeList
// }

// console.log(tranListToTreeData(list));
// 递归写法
// let list = [
//    {id:"01", pid:"",   "name":"老王" },
//    {id:"02", pid:"01", "name":"小张" }
//   ]
// function tranListToTreeData1(list, rootId = '') {
// // 注意这里是重点，每次递归的时候都会创建一个arr空数组
//   const arr = []
//   list.forEach(item => {
//     // 遍历list第一次的时候选出其中对象的pid为空的一项，这是最大的
//     // 当递归启动后就会把每一项的pid属性等于上级的id的都选出来
//     if (item.pid === rootId) {
//       // 把满足条件的项添加到arr数组中
//       arr.push(item)
//       // 给满足条件的一项添加children属性然后重新调用函数
//       // 注意这里传递的是满足条件的项的id,也就是说这里重新调用函数之后
//       // 把满足list中每一项的pid等于它的上级的元素都找出来放到一个新的arr数组中返回回来
//       // 也就是item.children=arr[满足条件的他的下级的数组]
//       // 并且给他们的上级的children属性添加进去
//       item.children = tranListToTreeData1(list, item.id)
//       console.log(item);
//     }
//   })
//   return arr
// }
// let arr=tranListToTreeData1(list)

</script>